package com.gnerv.sylvanas.framework.common.model;

import lombok.Getter;

/**
 * <p>
 * 通用返回状态码
 * 后续考虑设计抽象方法，提供动态设计和加载方式。有些业务状态码特别多而且会变动，避免重新打包发布。
 * </p>
 *
 * @author Gnerv LiGen
 */
@Getter
public enum RestResultCode {

    /**
     * 请求成功 无特殊需求 一般使用此响应码
     */
    CODE_200(200, "请求成功"),

    /**
     * 用于明确提示用户提交的新增资源的操作有效并成功执行
     */
    CODE_201(201, "创建成功"),

    /**
     * 用于明确提示用户提交的更新资源的操作有效并成功执行
     */
    CODE_202(202, "更新成功"),

    /**
     * 用于明确提示用户提交的删除资源的操作有效并成功执行
     */
    CODE_203(203, "删除成功"),

    /**
     * 用于明确提示用户提交的获取资源的操作有效并成功执行 但是未在服务器中获取到数据
     */
    CODE_204(204, "请求成功，但无内容。"),

    /**
     * 用于允许部分创建、更新、删除失败的业务情况 按业务需求返回相应的响应信息
     */
    CODE_206(206, "部分成功"),

    CODE_209(209, "认证成功"),
    CODE_210(210, "注销成功"),
    /**
     * 用于创建或者更新时需要的资源不存在的业务情况
     */
    CODE_304(304, "创建资源不存在"),
    CODE_305(305, "更新资源不存在"),
    CODE_306(306, "删除资源不存在"),

    /**
     * 用于请求参数错误
     */
    CODE_400(400, "请求参数错误"),

    /**
     * 用于禁止操作对应资源时
     */
    CODE_403(403, "禁止操作资源"),

    /**
     * 用于访问资源资源不存在时
     */
    CODE_404(404, "资源不存在"),


    /**
     * 用于没有访问接口权限时
     */
    CODE_407(407, "没有访问此接口的权限"),

    /**
     * 授权过期或者失效
     */
    CODE_408(408, "授权过期或者失效"),

    /**
     * 用于登陆失败时
     */
    CODE_410(410, "认证失败"),

    /**
     * 用于明确提示用户错误原因
     */
    CODE_412(412, "客户端请求信息的先决条件错误"),


    CODE_500(500, "系统异常"),
    CODE_503(503, "数据库异常"),
    CODE_504(504, "远端服务器异常");

    private final Integer code;
    private final String description;

    RestResultCode(Integer code, String description) {
        this.code = code;
        this.description = description;
    }

    public static RestResultCode getType(Integer code) {
        for (RestResultCode type : values()) {
            if (type.code.equals(code)) {
                return type;
            }
        }
        return null;
    }

}
